<?php
/**
 * Created by PhpStorm.
 * User: tangchao
 * Date: 19-4-19
 * Time: 下午2:36
 * 工厂模式 -- 方便实例化对象的统一管理
 * 单例模式 -- 减少重复连接
 */
define('BASEDIR',__DIR__);

include BASEDIR.'/Lib/Loader.php';

spl_autoload_register('\\Lib\\Loader::autoload');


//$facObj = \Lib\Factory::createDataBase();

//$reg = new \Lib\Register();
//$reg->set('db',\Lib\Factory::createDataBase());
//
//$db = $reg->get('db');
//
//var_dump($db);

//$db = new \Lib\Db\PDO();
//$db->connect('127.0.0.1','root','st826115','es_pool');
//$res = $db->query('select * from member');
//var_dump($res);

/*
 * 策略模式
*/
//class Page
//{
//
//    protected $strategy;
//
//    function index(){
//        $this->strategy->showAd();
//        $this->strategy->showCategory();
//    }
//
//    //是UserStrategy接口的对象
//    function setStrategy(\Lib\UserStrategy $strategy){
//        $this->strategy = $strategy;
//    }
//}
//
//$page = new Page();
//$data = 'male';
////策略模式--提高了底层业务代码的复用和解耦(消除了Page 与 MaleUserStrategy的依赖关系)
//if ($data == 'female'){
//    $strategy = new \Lib\FemaleUserStrategy();
//}else{
//    $strategy = new \Lib\MaleUserStrategy();
//}
//$page->setStrategy($strategy);
//$page->index();

//映射模式 -- ORM
//--单次调用
//$mapping = new \Lib\Mapping(1);
//$mapping->name = 'test';
//$mapping->mobile = '123456789';
//$mapping->regtime = date('Y-m-d H:i:s');

//--多次调用 采用了工厂模式加注册器模式
//Class Page{
//    function index(){
////        普通模式
////        $mapping = new \Lib\Mapping(1);
//        //使用工厂模式
//        $mapping = \Lib\Factory::getMapping(1);
//        $mapping->mobile = '135757974520';
//    }
//
//    function test(){
//        //        普通模式
////        $mapping = new \Lib\Mapping(1);
//        //使用工厂模式
//        $mapping = \Lib\Factory::getMapping(1);
//        $mapping->name = 'tang2';
//    }
//}
//
//$page = new Page();
//$page->index();
//$page->test();

//观察者模式
class Event extends \Lib\EventGenerayot {
    function trigger(){
        //触发事件
        echo 'event';

//        //传统 -- 耦合
//        echo 'logicA\n';
//        echo 'logicB\n';
//        echo 'logicC\n';

        //通知观察者
        $this->notify();
    }
}
//观察者1
//class Observer1 implements \Lib\Observer{
//    public function update($event_info = null)
//    {
//        // TODO: Implement update() method.
//        echo 'logicA';
//    }
//}
////观察者2
//class Observer2 implements \Lib\Observer{
//    public function update($event_info = null)
//    {
//        // TODO: Implement update() method.
//        echo 'logicB';
//    }
//}
//
//$event = new Event();
////添加观察者
//$event->addObserver(new Observer1);
//$event->addObserver(new Observer2);
////事件触发
//$event->trigger();

//原型模式
//例子:不同文件基于Canvas类画两个不同的矩形

//传统方式
//$start = microtime(true);
//$canvas1 = new \Lib\Canvas();
////初始化画布
//$canvas1->init();
////设置矩形
//$canvas1->rect(3,6,4,12);
////画出
//$canvas1->draw();
//echo '==========================';
//echo PHP_EOL;
//$canvas1 = new \Lib\Canvas();
////初始化画布
//$canvas1->init();
//$canvas1->rect(3,4,4,5);
////画出
//$canvas1->draw();
//echo PHP_EOL;
//echo microtime(true)-$start;

/*原型对象模式*/
//$start2 = microtime(true);
//$prototype = new \Lib\Canvas();
////初始化画布
//$prototype->init();
//
//$canvas1 = clone $prototype;
////设置矩形
//$canvas1->rect(3,6,4,12);
////画出
//$canvas1->draw();
//
//echo '==========================';
//echo PHP_EOL;
//
//$canvas2 = clone $prototype;
////设置矩形
//$canvas2->rect(3,4,4,5);
////画出
//$canvas2->draw();
//echo PHP_EOL;
//echo microtime(true)-$start2;


/**
 * 装饰器模式
 */

//$start = microtime(true);
//$canvas1 = new \Lib\Canvas();
////初始化画布
//$canvas1->init();
////设置矩形
//$canvas1->rect(3,6,4,12);
//
////添加装饰者
//$canvas1->addDecorator(new \Lib\ColorDrawDec('green'));
//$canvas1->addDecorator(new \Lib\SizeDrawDec('15px'));
//
////画出
//$canvas1->draw();

/**
 * 迭代器模式
 */
//使用到\Iterator接口
//$users = new \Lib\AllUser();
//foreach ($users as $user) {
//    var_dump($user->name);
//}

/**
 * 代理模式--隐藏具体实体的操作,常用于数据库主从的读写分离
 */
/*传统模式-手动选择主库还是从库*/
//$db = \Lib\Factory::getDataBase('slave');
//$infp = $db->query('select name from user');
//$db = \Lib\Factory::getDataBase('master');
//$res = $db->query('update user set name = "test" where id = 1');

/*代理模式 - 避免了手动选择*/
$proxy = new \Lib\UserProxy();
$proxy->getUserName(1);
$proxy->setUserName(1,'test');